#include <iostream>

//C++17, this feature of the vairable length parameter is futher brought to the expression
template<typename ... T>
auto sum(T ... t) {
    std::cout<< "sum involed."<<std::endl;
    return (t + ...);
}

int main() {
    std:: cout << sum(1,2,3,4,5,6,7,8,9, 10) << std::endl;
    return 0;
}

//折叠表达式是C++17新引进的语法特性。
//使用折叠表达式可以简化对C++11中引入的参数包的处理，从而在某些情况下避免使用递归。

//语法形式
//折叠表达式共有四种语法形式。分别为一元的左折叠和右折叠，以及二元的左折叠和右折叠。
// 1. 一元右折叠(unary right fold) 
// ( pack op ... ) 
// 2. 一元右折叠(E op ...)展开之后变为 E1 op (... op (EN-1 op EN))
// 一元左折叠(unary left fold) 
// ( ... op pack ) 
// 3. 一元左折叠(... op E)展开之后变为 ((E1 op E2) op ...) op EN
// 4. 二元右折叠(binary right fold) 
// ( pack op ... op init ) 
// 5. 二元右折叠(E op ... op I)展开之后变为 E1 op (... op (EN−1 op (EN op I)))
// 6. 二元左折叠(binary left fold) 
// ( init op ... op pack ) 
// 7. 二元左折叠(I op ... op E)展开之后变为 (((I op E1) op E2) op ...) op EN